package http_jwt

import (
	"github.com/golang-jwt/jwt/v5"
	"time"
)

// mySigningKey 这是你的秘钥
var mySigningKey = []byte("lgb24kcs.cn")

// TokenInfo 自定义结构体
type TokenInfo struct {
	OpenID string
}
type MyClaims struct {
	TokenInfo TokenInfo
	jwt.RegisteredClaims
}

// CreateToken 定义一个简单的token创建器
func CreateToken(OpenID string) (string, error) {
	tokeninfo := TokenInfo{OpenID: OpenID}
	claims := MyClaims{
		TokenInfo: tokeninfo,
		RegisteredClaims: jwt.RegisteredClaims{
			ID:        OpenID,
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(3 * time.Hour * time.Duration(1))), // 过期时间
			Issuer:    "test",
		},
	}

	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	stc, err := token.SignedString(mySigningKey)
	if err != nil {
		return "", err
	} else {
		return stc, nil
	}
}

func CheckoutToken(tokenString string) (*MyClaims, error) {
	token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (interface{}, error) {
		return mySigningKey, nil
	})
	if err != nil {
		return nil, err
	}
	// 从tokenClaims中获取到Claims对象，并使用断言，将该对象转换为我们自己定义的Claims
	// 要传入指针，项目中结构体都是用指针传递，节省空间。
	if claims, ok := token.Claims.(*MyClaims); ok && token.Valid {
		return claims, nil
	}
	return nil, err
}
